home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu013.dms / pu013.adf / not_mine / BIGBOOT.S next >
Text File  |  2000-01-01  |  11KB  |  624 lines

  1. ExecBase:    EQU    4
  2. AllocSignal:    EQU    -$14a
  3. FindTask:    EQU    -$126
  4. FreeSignal:    EQU    -$150
  5. AllocMem:    EQU    -$c6
  6. FreeMem:    EQU    -$d2
  7. AddPort:    EQU    -$162
  8. RemPort:    EQU    -$168
  9. OpenDevice:    EQU    -$1bc
  10. CloseDevice:    EQU    -$1c2
  11. DoIO:        EQU    -$1c8
  12. WaitIO:        EQU    -$1d8
  13. Alert:        EQU    -$6c
  14. CloseLibrary:    EQU    -$19e
  15. OpenLibrary:    EQU    -$228
  16.  
  17. Open:        EQU    -$1e
  18. Close:        EQU    -$24
  19. Read:        EQU    -$2a
  20. Write:        EQU    -$30
  21. Input:        EQU    -$36
  22. Output:        EQU    -$3c
  23. Lock:        EQU    -$54
  24. Examine:    EQU    -$66
  25.  
  26. FIBSize:    EQU    300
  27. FileSize:    EQU    124
  28.  
  29. CMD_Reset:    EQU    1
  30. CMD_Read:    EQU    2
  31. CMD_Write:    EQU    3
  32. CMD_UpDate:    EQU    4
  33. CMD_Clear:    EQU    5
  34. CMD_Stop:    EQU    6
  35. CMD_Start:    EQU    7
  36. CMD_Flush:    EQU    8
  37. TD_Motor:    EQU    9
  38. TD_Seek:    EQU    10
  39. TD_Format:    EQU    11
  40. TD_Remove:    EQU    12
  41. TD_ChangeNum:    EQU    13
  42. TD_ChangeState:    EQU    14
  43. TD_ProtStatus:    EQU    15
  44.  
  45. io_Command:    EQU    28
  46. io_Error:    EQU    30
  47. io_Actual:    EQU    32
  48. io_Lenght:    EQU    36
  49. io_Data:    EQU    40
  50. io_Offset:    EQU    44
  51.  
  52. BlockLongPos:    EQU    $b8
  53.  
  54. start:
  55.   move.l    ExecBase,a6
  56.   move.l    #DosName,a1
  57.   clr.l        d0
  58.   jsr        OpenLibrary(a6)
  59.   move.l    d0,DosBase
  60.   beq        NoDos
  61.   move.l    #Welcome,a0
  62.   bsr        print
  63.   move.l    #Quest1,a0
  64.   bsr        print
  65.   move.l    BootName,a0
  66.   bsr        print
  67.   move.l    #Quest2,a0
  68.   bsr        print
  69.   bsr        GetChars
  70.   move.b    #0,-1(a0,d0)        ;return loeschen
  71.   cmp.w        #1,d0
  72.   bne        default
  73.   move.l    BootName,a0
  74. default:
  75.   move.l    #1024,d1  ;minimalgr. wg. checksum
  76.   bsr         GetFile
  77.   move.l    d0,FileOrt
  78.   move.l    d1,FileLenght
  79.   beq        NoFile
  80.   add.w        #511,d1
  81.   lsr.l        #8,d1
  82.   lsr.l        #1,d1
  83.   sub.w        #2,d1
  84.   cmp.w        #0,d1
  85.   bgt        ok
  86.   move.w    #0,d1
  87. ok:
  88.   move.w    d1,FileSects
  89.   move.l    #Quest3,a0
  90.   bsr        print
  91.   bsr        GetChars
  92.   move.l    #0,d0
  93.   bsr        GetTrackDisk
  94.   move.l    ExecBase,a6
  95.   move.l    #$0800,d0
  96.   move.l    #$10002,d1
  97.   jsr        AllocMem(a6)
  98.   move.l    d0,TDBuffer
  99.   bne        goon1
  100.   move.l        #NoTDMem,a0
  101.   bsr        print
  102.   bra        cleanup3
  103.   goon1:
  104.   bsr        MotorOn
  105.   move.l    TDBuffer,a0
  106.   move.l    #1024,d0
  107.   move.l    DiskRequest,a1
  108.   move.l    #880,d1
  109.   bsr        DRead
  110.   move.l    TDBuffer,a0
  111.   add.l        #$13C,a0
  112.   move.l    (a0),d1
  113.   move.l    d1,BitMapSektor
  114.   add.l        #$2C4,a0
  115.   move.l     DiskRequest,a1
  116.   move.l    #$400,d0
  117.   bsr        DRead
  118.   move.l    TDBuffer,a0
  119.   add.l        #$400,a0
  120.   move.l    4(a0),d0
  121.   move.w    #0,d1
  122.   clr.l        d2
  123.   move.l    #2,d3
  124.   move.l    #3,d4
  125.   move.w    FileSects,d5
  126. secloop:
  127.   btst        d1,d0
  128.   beq        nomore
  129.   cmp.w        d5,d2
  130.   bhs        hab_genug
  131.   bclr        d1,d0
  132.   bset        d3,d4
  133. hab_genug:
  134.   add.l        #1,d2
  135. nomore:
  136.   addi.w    #1,d1
  137.   addi.w    #1,d3
  138.   cmp.w        #20,d1
  139.   blt        secloop
  140.   move.l    d0,4(a0)
  141.   move.w    d2,Tracksects
  142.   move.l    d4,BlockLong
  143.   move.l    #MengeMsg,a0
  144.   bsr        print
  145.   clr.l        d0
  146.   move.w    Tracksects,d0
  147.   bsr        ItoA
  148.   bsr        print
  149.   move.l    #Menge2Msg,a0
  150.   bsr        print
  151.   move.w    TrackSects,d2
  152.   cmp.w        Filesects,d2
  153.   bhi        goon2
  154.   move.l    #StillUsed,a0
  155.   bsr        print
  156.   bra        Cleanup4
  157. goon2:
  158.   move.l    FileOrt,a0
  159.   move.l    BlockLong,d4
  160.   move.l    d4,BlockLongPos(a0)
  161.   bsr        BootblockChecksum
  162.   move.l    #$200,d0
  163.   move.l    #$0,d1
  164.   clr.l        d3
  165. wrloop:
  166.   bclr         d3,d4
  167.   beq        dontwrite
  168.   bsr        DWrite
  169.   bne        cleanup4
  170.   add.l        #$200,a0
  171. dontwrite:
  172.   add.w        #1,d3
  173.   add.l        #$200,d1
  174.   tst.l        d4
  175.   bne        wrloop
  176.   jsr        DUpDate
  177.   move.l    TDBuffer,a0
  178.   add.l        #$400,a0
  179.   bsr        BitMapChecksum
  180.   move.l    BitMapSektor,d1
  181.   move.l    #512,d0
  182.   lsl.l        #8,d1
  183.   lsl.l        #1,d1
  184.   bsr        DWrite
  185.   bne        cleanup4
  186.   bsr        DUpDate
  187.   move.l    #GoodInstall,a0
  188.   bsr        print
  189. cleanup4:
  190.   bsr        MotorOff
  191. cleanup3:
  192.   move.l    ExecBase,a6
  193.   move.l    TDBuffer,a1
  194.   move.l    #$0800,d0
  195.   jsr        FreeMem(a6)
  196.   move.l    ExecBase,a6
  197.   move.l    FileOrt,a1
  198.   move.l    FileLenght,d0
  199.   jsr        FreeMem(a6)
  200.   move.l    DiskRequest,a1
  201.   bsr        CloseTrackDisk
  202. NoFile:
  203.   move.l    ExecBase,a6
  204.   move.l    DosBase,a1
  205.   jsr        CloseLibrary(a6)
  206. NoDos:
  207.   move.l    oldcheck,d0
  208.   move.l    newcheck,a0
  209. ;ILLEGAL
  210.   clr.l        d0
  211.   rts
  212. FileOrt:        dc.l    0
  213. FileLenght:        dc.l    0
  214. FileSects:        dc.w    0
  215. TrackSects:        dc.w    0
  216. BitMapSektor:        dc.l    0
  217. TDBuffer:        dc.l    0
  218. BlockLong:        dc.l    0
  219. BootName:        dc.l    bn
  220. bn:            dc.b    "df0:boottrack",0
  221. even
  222.  
  223. BootblockChecksum:
  224.   movem.l    d0-d3/a0-a1,-(a7)
  225.   clr.l        d0
  226.   clr.l        d2
  227.   clr.l        d3
  228.   move.l    #$FF,d1
  229.   move.l    a0,a1
  230.   clr.l        $4(a0)
  231.   move.w    #$4,CCR
  232. bo_Checkloop:
  233.   move.l    (a0)+,d2
  234.   addx.l    d2,d0
  235.   dbra        d1,bo_Checkloop
  236.   move.l    #-1,d1
  237.   subx.l    d0,d1
  238.   move.l    d1,$4(a1)
  239.   move.l    d1,test
  240.   movem.l    (a7)+,d0-d3/a0-a1
  241.   rts
  242.  
  243. BitMapChecksum:
  244.   movem.l    d0-d3/a0-a1,-(a7)
  245.   clr.l        d0
  246.   clr.l        d2
  247.   clr.l        d3
  248.   move.l    a0,a1
  249.   move.l    (a0),oldcheck
  250.   clr.l        (a0)
  251.   move.w    #$7F,d1
  252. bm_Checkloop:
  253.   move.l    (a0)+,d2
  254.   sub.l        d2,d0
  255.   dbra        d1,bm_Checkloop
  256.   move.l    d0,(a1)
  257.   move.l    d0,newcheck
  258.   movem.l    (a7)+,d0-d3/a0-a1
  259.   rts
  260.  
  261. ItoA:
  262.   move.l    #ASCII_Zahl+6,a0
  263.   move.l    #0,-4(a0)
  264.   move.w    #0,-6(a0)
  265. w_loopi:
  266.   divu        #10,d0
  267.   swap        d0
  268.   addi.w    #"0",d0
  269.   move.b    d0,-(a0)
  270.   clr.w        d0
  271.   swap        d0
  272.   cmp.w        #0,d0
  273.   bne        w_loopi
  274.   rts
  275. even
  276. ASCII_zahl:    blk.b    7,0
  277. even
  278. MotorOn:
  279.   move.l    DiskRequest,a1
  280.   move.w    #TD_Motor,io_Command(a1)
  281.   move.l    #1,io_Lenght(a1)
  282.   move.l    ExecBase,a6
  283.   jsr        DoIO(a6)
  284.   rts
  285. MotorOff:
  286.   move.l    DiskRequest,a1
  287.   move.w    #TD_Motor,io_Command(a1)
  288.   move.l      #0,io_Lenght(a1)
  289.   move.l    ExecBase,a6
  290.   jsr        DoIO(a6)
  291.   rts
  292. DCheckWP:
  293.   movem.l    d0-d7/a0-a6,-(a7)
  294.   move.l        DiskRequest,a1
  295.   move.w    #TD_Protstatus,io_Command(a1)
  296.   move.l    ExecBase,a6
  297.   jsr        DoIO(a6)
  298.   move.l    DiskRequest,a1
  299.   move.l    io_Actual(a1),d0
  300.   movem.l     (a7)+,d0-d7/a0-a6
  301.   rts
  302. DRead:
  303.   lsl.l        #8,d1
  304.   lsl.l        #1,d1
  305.   move.w    #CMD_Read,io_Command(a1)
  306.   move.l    d1,io_Offset(a1)
  307.   move.l    a0,io_Data(a1)
  308.   move.l    d0,io_Lenght(a1)
  309.   move.l    ExecBase,a6
  310.   jsr        DoIO(a6)
  311.   rts
  312. even
  313. DWrite:
  314.   movem.l    d0-d7/a0-a6,-(a7)
  315.   bsr        DCheckWP
  316.   beq        NotProtected
  317.   move.l    #WPon,a0
  318.   bsr        print
  319.   move.b    #1,d0
  320.   bra        EndofWrite
  321. NotProtected:
  322.   move.l    DiskRequest,a1
  323.   move.l    d1,io_Offset(a1)
  324.   move.w    #CMD_Write,io_Command(a1)
  325.   move.l    d0,io_Lenght(a1)
  326.   move.l    a0,io_Data(a1)
  327.   move.l    ExecBase,a6
  328.   jsr        DoIO(a6)
  329.   move.b    #0,d0
  330. EndofWrite:
  331.   movem.l    (a7)+,d0-d7/a0-a6
  332.   rts
  333. DUpDate:
  334.   movem.l    d0-d7/a0-a6,-(a7)
  335.   move.l    DiskRequest,a1
  336.   move.w    #CMD_UpDate,io_Command(a1)
  337.   move.l    ExecBase,a6
  338.   jsr        DoIO(a6)
  339.   movem.l    (a7)+,d0-d7/a0-a6
  340.   rts
  341. GetTrackDisk:
  342.   move.l    d0,Unit
  343.   move.l    #0,a0
  344.   move.b    #0,d0
  345.   bsr        CreatePort
  346.   move.l    a0,DiskPort
  347.   beq        gt_fail1
  348.   move.l    #56,d0
  349.   bsr        CreateExtIO
  350.   move.l    a0,DiskRequest
  351.   beq        gt_fail2
  352.   move.l    ExecBase,a6
  353.   move.l    #DiskName,a0
  354.   move.l    Unit,d0
  355.   move.l    DiskRequest,a1
  356.   move.l    #0,d1
  357.   jsr        OpenDevice(a6)
  358.   tst.l        d0
  359.   bne        gt_fail3
  360.   move.l    DiskRequest,a1
  361.   rts
  362. gt_fail1:
  363.   move.l    #0,a1
  364.   rts
  365. CloseTrackDisk:
  366.   move.l    a1,DiskRequest
  367.   move.l    ExecBase,a6
  368.   move.l    DiskRequest,a1
  369.   jsr        CloseDevice(a6)
  370. gt_fail2:
  371.   move.l    DiskRequest,a0
  372.   bsr        DeleteExtIO
  373. gt_fail3:
  374.   move.l    DiskPort,a0
  375.   bsr        DeletePort
  376.   move.l    #0,a1
  377.   rts
  378. Unit:        DC.L    0
  379. DiskPort:    DC.L    0
  380. DiskRequest:    DC.L    0
  381. DiskName:    DC.B    "trackdisk.device",0
  382. even
  383. even
  384. CreatePort:
  385.   move.l    a0,Name
  386.   move.b    d0,Prio
  387.   move.l    ExecBase,a6
  388.   move.b    #-1,d0
  389.   jsr        AllocSignal(a6)
  390.   move.b    d0,sigBit
  391.   bmi.l        NoSignal
  392.   move.l    ExecBase,a6
  393.   move.l    #$10002,d1
  394.   move.l    #34,d0
  395.   jsr        AllocMem(a6)
  396.   move.l    d0,port
  397.   beq        NoMemory
  398.   move.l    d0,a0
  399.   move.l    Name,10(a0)
  400.   move.b    Prio,9(a0)
  401.   move.b    #4,8(a0)
  402.   move.b    #0,14(a0)
  403.   move.b    sigBit,15(a0)
  404.   move.l    ExecBase,a6
  405.   move.l    #0,a1
  406.   jsr        FindTask(a6)
  407.   move.l    d0,16(a0)
  408.   cmpi.l    #0,Name
  409.   beq            doNewList
  410.   move.l    ExecBase,a6
  411.   move.l    port,a1
  412.   jsr        AddPort(a6)
  413.   bra.s        rts
  414. doNewList:
  415.   lea        20(a0),a0
  416.   bsr        NewList
  417. rts:
  418.   move.l    port,a0
  419.   rts
  420. NoSignal:
  421.   clr.l        port
  422.   bra.s        rts
  423. NoMemory:
  424.   move.l    ExecBase,a6
  425.   clr.l        d0
  426.   move.b    sigBit,d0
  427.   jsr        FreeSignal(a6)
  428.   bra.s        NoSignal
  429. even
  430. port:        dc.l    0
  431. sigBit:        dc.b    0
  432. Prio:        dc.b    0
  433. Name:        dc.l    0
  434. DeletePort:
  435.   cmpi.l    #0,10(a0)
  436.   beq        NoRemPort
  437.   move.l    a0,-(a7)
  438.   move.l    ExecBase,a6
  439.   move.l    a0,a1
  440.   jsr        RemPort(a6)
  441.   move.l    (a7)+,a0
  442. NoRemPort:
  443.   move.b    #$ff,8(a0)
  444.   move.l    #-1,20(a0)
  445.   move.l    a0,-(a7)
  446.   move.l    ExecBase,a6
  447.   clr.l        d0
  448.   move.b    15(a0),d0
  449.   jsr        FreeSignal(a6)
  450.   move.l    ExecBase,a6
  451.   move.l    (a7)+,a1
  452.   move.l    #34,d0
  453.   jsr        FreeMem(a6)
  454.   rts
  455. LH_Tail:        EQU    4
  456. LH_TailPred:           EQU    8
  457. NewList:
  458.   move.l    a0,(a0)
  459.   addq.l    #LH_Tail,(a0)
  460.   clr.l        LH_Tail(a0)
  461.   move.l    a0,LH_TailPred(a0)
  462.   rts
  463. CreateExtIO:
  464.   cmpi.l    #0,a0
  465.   beq        NoReplyPort
  466.   move.w    d0,Size
  467.   move.l    a0,ReplyPort
  468.   move.l    ExecBase,a6
  469.   move.l    #$10002,d1
  470.   jsr        AllocMem(a6)
  471.   move.l    d0,a0
  472.   beq        NoMemory2
  473.   move.b    #5,8(a0)
  474.   move.w    Size,18(a0)
  475.   move.l    ReplyPort,14(a0)
  476.   rts
  477. NoReplyPort:
  478. NoMemory2:
  479.   move.l    #0,a0
  480.   rts
  481. Size:        dc.w    0
  482. ReplyPort:    dc.l    0
  483. DeleteExtIO:
  484.   cmpi.l    #0,a0
  485.   beq        rts2
  486.   move.b    #$ff,8(a0)
  487.   move.l    #-1,20(a0)
  488.   move.l    #-1,24(a0)
  489.   move.l    ExecBase,a6
  490.   move.w    18(a0),d0
  491.   move.l    a0,a1
  492.   jsr        FreeMem(a6)
  493. rts2:
  494.   rts
  495. CreateStdIO:
  496.   move.l    #32,d0
  497.   bsr        CreateExtIO
  498.   rts
  499. DeleteStdIO:
  500.   bsr            DeleteExtIO
  501.   rts
  502. align 4
  503. GetFile:
  504.   move.l    a0,FileName
  505.   move.l    d1,BufferSize
  506.   move.l    DosBase,a6
  507.   move.l    FileName,d1
  508.   move.l    #1005,d2
  509.   jsr        Lock(a6)
  510.   move.l    d0,FileLock
  511.   beq        rts
  512.   move.l    ExecBase,a6
  513.   move.l    #FIBSize,d0
  514.   move.l    #$10002,d1
  515.   jsr        AllocMem(a6)
  516.   move.l    d0,FileInfoBlock
  517.   beq        arts
  518.   move.l    DosBase,a6
  519.   move.l    FileLock,d1
  520.   move.l    FileInfoBlock,d2
  521.   jsr        Examine(a6)
  522.   cmpi.w    #0,d0
  523.   beq        FreeFIB
  524.   move.l    FileInfoBlock,a0
  525.   move.l    FileSize(a0),d0
  526.   addi.l    #16,d0
  527.   cmp.l        BufferSize,d0
  528.   blt        gross_genug
  529.   move.l    d0,BufferSize
  530. gross_genug:
  531.   move.l    ExecBase,a6
  532.   move.l    BufferSize,d0
  533.   move.l    #$10002,d1
  534.   jsr        AllocMem(a6)
  535.   move.l    d0,Buffer
  536.   beq        FreeFIB
  537.   move.l    DosBase,a6
  538.   move.l    FileName,d1
  539.   move.l    #1005,d2
  540.   jsr        Open(a6)
  541.   move.l    d0,Handle
  542.   beq        FreeBuf
  543.   move.l    DosBase,a6
  544.   move.l    Handle,d1
  545.   move.l    Buffer,d2
  546.   move.l    BufferSize,d3
  547.   jsr        Read(a6)
  548.   cmpi.w    #0,d0
  549.   beq        FreeBuf
  550. CloseIt:
  551.   move.l    DosBase,a6
  552.   move.l    Handle,d1
  553.   jsr        Close(a6)
  554. FreeFIB:
  555.   move.l    ExecBase,a6
  556.   move.l    #FIBSize,d0
  557.   move.l    FileInfoBlock,a1
  558.   jsr        FreeMem(a6)
  559.   move.l    Buffer,d0
  560. arts:
  561.   move.l    BufferSize,d1
  562.   rts
  563. FreeBuf:
  564.   move.l    ExecBase,a6
  565.   move.l    BufferSize,d0
  566.   move.l    Buffer,a1
  567.   jsr        FreeMem(a6)
  568.   move.l    #0,Buffer
  569.   bra        CloseIt
  570. Handle:        dc.l    0
  571. FileLock:    dc.l    0
  572. FileInfoBlock:    dc.l    0
  573. Buffer:        dc.l    0
  574. BufferSize:    dc.l    0
  575. DosBase:    dc.l    0
  576. FileName:    dc.l    0
  577. DosName:    dc.b    'dos.library',0
  578. even
  579. print:
  580.   move.l    a0,-(a7)
  581.   move.l    DosBase,a6
  582.   jsr        Output(a6)
  583.   move.l    d0,d1
  584.   move.l    (a7)+,a0
  585.   move.l    a0,d2
  586.   andi.w    #-2,d2
  587. NullFind:
  588.   tst.b        (a0)+
  589.   bne.s        NullFind
  590.   move.l    a0,d3
  591.   sub.l        d2,d3
  592.   move.l    DosBase,a6
  593.   jsr        Write(a6)
  594.   rts
  595. GetChars:
  596.   move.l    DosBase,a6
  597.   jsr        Input(a6)
  598.   move.l    d0,d1
  599.   move.l    #InBuffer,d2
  600.   move.l    #80,d3
  601.   move.l    DosBase,a6
  602.   jsr        Read(a6)
  603.   move.l    #InBuffer,a0
  604.   rts
  605. InBuffer:    blk.b        40,0
  606. test:        dc.l        0
  607. oldcheck:    dc.l        0
  608. newcheck:    dc.l        0
  609. even
  610. NoTDMem:  dc.b    "No room for trackdiskbuffer",10,0
  611. even
  612. StillUsed:dc.b    "No room for bootblock on this disk",10,0
  613. even
  614. Welcome:  dc.b    0    ;text followed by 0
  615. Quest1:      dc.b    "Filename to install? (return =",34,0
  616. Quest2:      dc.b    34,") :",0
  617. Quest3:      dc.b    "Insert disk to be installed in df0: and press"
  618.       dc.b    " return",0
  619. MengeMsg: dc.b    0    ;text followed by 0
  620. Menge2Msg:dc.b    " sectors free ",0
  621. WPon:      dc.b    "disk is write-protected",10,0
  622. GoodInstall:
  623.       dc.b    "Boottrack installed.",10,0
  624.